Import('env', 'os', 'glob', 'sys', 'hasQt', 'hasCollada', 'hasBreakpad', 'mainEnv',
        'resources', 'converter_objects')

# For running Uic & Moc (below)
def recursiveDirs(root) :
        return list(filter((lambda a : a.rfind(".svn") == -1), [a[0] for a in os.walk(root)]))

def unique(l) :
        return list(dict.fromkeys(l).keys())

def scanFiles(dir, accept=["*.cpp"], reject=[]) :
        sources = []
        paths = recursiveDirs(dir)
        for path in paths:
                for pattern in accept :
                        sources+=glob.glob(path + "/" + pattern)
        for pattern in reject:
                sources = list(filter((lambda a : a.rfind(pattern) == -1), sources))
        sources = list(map((lambda a : os.path.basename(a)), sources))
        return unique(sources)


if hasQt:
        qtEnv = mainEnv.Clone()
        qtEnv.Append(CPPPATH=['#src/mtsgui'])
        if 'QTINCLUDE' in qtEnv:
                qtEnv.Prepend(CPPPATH=qtEnv['QTINCLUDE'])
        qtEnv.EnableQt5Modules(['QtGui', 'QtWidgets', 'QtCore', 'QtOpenGL', 'QtXml', 'QtXmlPatterns', 'QtNetwork'])

        if sys.platform == 'win32':
                index = qtEnv['CXXFLAGS'].index('_CONSOLE')
                del qtEnv['CXXFLAGS'][index-1]
                del qtEnv['CXXFLAGS'][index-1]
                index = qtEnv['LINKFLAGS'].index('/SUBSYSTEM:CONSOLE')
                del qtEnv['LINKFLAGS'][index]
                qtEnv.Append(CXXFLAGS=['/D', '_WINDOWS', '/D', 'MTS_CUSTOM_QTMAIN', '/D', 'MTSGUI_STATIC_QFILEDIALOG=1'])
                qtEnv.Append(LINKFLAGS=['/SUBSYSTEM:WINDOWS'])
                qtEnv.Append(LIBS=['qtmain', 'shell32'])
        elif sys.platform == 'darwin':
                qtEnv.Append(LINKFLAGS=['-Fdependencies/frameworks', '-framework',
                        'BWToolkitFramework', '-framework', 'Security', '-framework', 'CoreFoundation'])
                # Qt 4 headers cause a lot of warnings on clang/OSX -- turn them off
                if qtEnv['CXX'] == 'clang++':
                        qtEnv.Append(CPPFLAGS=['-Wno-unused-private-field', '-Wno-uninitialized'])
                qtEnv.Append(LINKFLAGS=['-Xlinker', '-rpath', '-Xlinker', '@executable_path/../Frameworks'])

        bpath = env.GetBuildPath('#src/mtsgui')
        qtInterfaces = [qtEnv.Uic5(uic) for uic in scanFiles(bpath, ['*.ui'])]
        qtResources = [qtEnv.Qrc(qrc) for qrc in scanFiles(bpath, ['*.qrc'])]
        qtSources = scanFiles(bpath, ['*.cpp']) + qtResources + resources

        if hasCollada:
                qtSources += converter_objects
                if 'COLLADALIBDIR' in env:
                        qtEnv.Prepend(LIBPATH=env['COLLADALIBDIR'])
                if 'COLLADALIB' in env:
                        qtEnv.Prepend(LIBS=env['COLLADALIB'])

        if sys.platform == 'darwin':
                mainEnv_osx = mainEnv.Clone()
                qtEnv_osx = qtEnv.Clone()
                mainEnv_osx.ConfigureForObjectiveCPP()
                qtEnv_osx.ConfigureForObjectiveCPP()
                mainEnv_osx.Program('symlinks_install', ['symlinks_install.c'])
                qtEnv_osx['CXXFLAGS'].append(['-Fdependencies/frameworks', '-framework', 'BWToolkitFramework'])
                qtSources += qtEnv_osx.StaticObject('previewsettingsdlg_cocoa_impl.mm')
        else:
                qtSources = [x for x in qtSources if (not isinstance(x, str) or 'cocoa' not in x)]

        mtsgui = qtEnv.Program('mtsgui', qtSources)
        if sys.platform == 'darwin':
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtGui.framework/Versions/5/QtGui @rpath/QtGui $TARGET')
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtWidgets.framework/Versions/5/QtWidgets @rpath/QtWidgets $TARGET')
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtCore.framework/Versions/5/QtCore @rpath/QtCore $TARGET')
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtOpenGL.framework/Versions/5/QtOpenGL @rpath/QtOpenGL $TARGET')
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtXml.framework/Versions/5/QtXml @rpath/QtXml $TARGET')
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtNetwork.framework/Versions/5/QtNetwork @rpath/QtNetwork $TARGET')
                qtEnv.AddPostAction(mtsgui, 'install_name_tool -change @rpath/QtXmlPatterns.framework/Versions/5/QtXmlPatterns @rpath/QtXmlPatterns $TARGET')

